#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;


//double Division(int a, int b)
//{
//	if (b == 0)
//		throw "Division by zero condition!";
//	else
//		return (double)a / (double)b;
//}
//void Func()
//{
//	int len, time;
//	cin >> len >> time;
//	try
//	{
//		cout << Division(len, time) << endl;
//	}
//	catch (const char* str)
//	{
//		cout << "Func:" << str << endl;
//	}
//}
//int main()
//{
//	try 
//	{
//		Func();
//	}
//	catch (const char* errmsg)
//	{
//		cout << "main:" << errmsg << endl;
//	}
//	catch (...) 
//	{
//		cout << "main: unkown exception" << endl;
//	}
//
//	string str;
//	cin >> str;
//	cout << str << endl;
//
//	return 0;
//}




//double Division(int a, int b) throw(const char*)
//{
//	if (b == 0)
//		throw "Division by zero condition!";
//	else
//		return (double)a / (double)b;
//}
//void Func()
//{
//	int* ptr = new int[10];
//
//	int len, time;
//	cin >> len >> time;
//	try
//	{
//		cout << Division(len, time) << endl;
//	}
//	catch (int ret)
//	{
//		cout << "Func:" << ret << endl;
//	}
//	catch (...)
//	{
//		delete[] ptr;
//		cout << "delet [] ptr" << endl;
//
//		throw;
//	}
//
//	delete[] ptr;
//	cout << "delet [] ptr" << endl;
//}
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const char* errmsg)
//	{
//		cout << "main:" << errmsg << endl;
//	}
//	catch (...)
//	{
//		cout << "main: unkown exception" << endl;
//	}
//
//
//	return 0;
//}



class Person
{
public:
	Person(const string& str, int code)
		:_errmsg(str),_exitcode(code)
	{}
	virtual void what()
	{
		cout << _errmsg << endl;
	}
protected:
	string _errmsg = "Person massage";
	int _exitcode = 0;
};

class Student : public Person
{
public:
	Student(const string& str, int code)
		:Person(str,code)
	{}
	virtual void what()
	{
		cout << _errmsg << endl;
	}
};
class Teacher : public Person
{
public:
	Teacher(const string& str, int code)
		:Person(str, code)
	{}
	virtual void what()
	{
		cout << _errmsg << endl;
	}
};


void Func()
{
	int r = rand();
	if (r % 3 == 0)
	{
		throw Teacher("Teacher fail massage",1);
	}
	else if (r % 3 == 1)
	{
		throw Student("Student fail massage",1);
	}
	else
	{
		throw Person("Person fail massage",1);
	}
}


int main()
{
	srand(time(0));
	while (1)
	{
		try
		{
			Func();
		}
		catch (Person& e)
		{
			e.what();
		}
	}

	return 0;
}